package com.uade.magicCompany.services;

import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

import com.uade.magicCompany.dao.DAOGrupoUsuarios;
import com.uade.magicCompany.dao.DAOUsuarios;
import com.uade.magicCompany.dao.DAOUsuariosImpl;
import com.uade.magicCompany.dao.DaoGrupoUsuariosImpl;
import com.uade.magicCompany.entities.GrupoUsuarioEntity;
import com.uade.magicCompany.entities.UsuarioEntity;
import com.uade.magicCompany.model.GrupoUsuario;
import com.uade.magicCompany.model.Modelo;
import com.uade.magicCompany.model.Usuario;

public class GestionGrupoUsuariosImpl implements GestionGrupoUsuarios {

	private DAOGrupoUsuarios dao = new DaoGrupoUsuariosImpl();
	private DAOUsuarios daoU = new DAOUsuariosImpl();
	private Logger log = Logger.getLogger(GestionGrupoUsuariosImpl.class);
	private GrupoUsuarioEntity grupoUsuarioEntity = null;

	@Override
	public void crearGrupoUsuario(String loginName, String nombreGrupo) {
		GrupoUsuarioEntity grupoUsuarioEntity = new GrupoUsuarioEntity();
		// 1 Obtengo el usuario
		// UsuarioEntity usuarioEntity =
		// daoU.obtenerUsuarioPorNombre(loginName);
		UsuarioEntity usuarioEntity = daoU.findById(Long.valueOf(loginName));
		// 2 Valido y creo el grupo
		if (usuarioEntity != null) {
			grupoUsuarioEntity.setEstado(Modelo.ACTIVO);
			grupoUsuarioEntity.setNombre(nombreGrupo);
			List<UsuarioEntity> usuarios = new ArrayList<UsuarioEntity>();
			usuarios.add(usuarioEntity);
			dao.create(grupoUsuarioEntity);
			// Actualizo el user
			usuarioEntity.setGrupoUsuario(grupoUsuarioEntity);
			daoU.update(usuarioEntity);
			log.info("Se creo el grupo de usuarios para el usuario "
					+ loginName + " iduser:" + usuarioEntity.getId());
			this.grupoUsuarioEntity = grupoUsuarioEntity;
		} else {
			log.info("No se creo el grupo, no existe usuario registrado con nombre: "
					+ loginName);
		}

	}

	@Override
	public void vincularUsuario(long idUsuarioAVincular,
			long idUsuarioVinculante) {
		// 1 obtengo el usuario
		UsuarioEntity usuarioVinculante = daoU.findById(idUsuarioVinculante);
		UsuarioEntity usuarioAVincular = daoU.findById(idUsuarioAVincular);

		// 2 obtengo el grupo
		if (usuarioVinculante != null) {
			GrupoUsuarioEntity grupoUsuarioEntity = dao
					.findById(usuarioVinculante.getGrupoUsuario().getId());
			// 3 actualizo el usuario con el grupo
			if (grupoUsuarioEntity != null) {
				usuarioAVincular.setGrupoUsuario(grupoUsuarioEntity);
				daoU.update(usuarioAVincular);
			} else {
				log.info("No se realizo la operacion, no existe ningun grupo con id:"
						+ grupoUsuarioEntity.getId());
			}
		} else {
			log.info("No se realizo la operacion, no existe ningun usuairo con id:"
					+ idUsuarioAVincular);
			return;
		}

	}

	@Override
	public Usuario obtenerUsuario(String loginName) {
		UsuarioEntity usuarioE = daoU.findById(Long.valueOf(loginName));
		Usuario usuario = usuarioE.getUsuario();
		return usuario;
	}

	@Override
	public boolean tieneGrupoAsociado(String usuarioId) {
		Usuario usuario = obtenerUsuario(usuarioId);
		GrupoUsuario grupo = usuario.getGrupo();
		if (null != grupo) {
			return grupo.getId() != null;
		} else {
			return false;
		}
	}

	@Override
	public List<Usuario> obtenerUsuariosDelGrupo(long idUsuario) {

		UsuarioEntity usuarioE = daoU.findById(idUsuario);
		List<UsuarioEntity> usuarioeList = new ArrayList<UsuarioEntity>();
		List<Usuario> usuarioListModel = new ArrayList<Usuario>();
		if (usuarioE.getGrupoUsuario() != null) {
			usuarioeList = daoU.obtenerUsuarioPorGrupo(usuarioE
					.getGrupoUsuario().getId());
		}
		for (UsuarioEntity uE : usuarioeList) {
			usuarioListModel.add(uE.getUsuario());
		}

		return usuarioListModel;

	}

}
